 package client.skills;

 import constants.JobConstants;
import constants.SkillConstants;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import provider.MapleData;
import provider.MapleDataTool;
import provider.MapleDataType;
import server.MapleStatEffect;
import server.MapleStatEffectFactory;
import server.life.Element;
import tools.Pair;
import tools.Randomizer;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



















 public class Skill implements Serializable
 {
    private static final long serialVersionUID = 202104;
/*  24 */   public static final Logger log = LogManager.getLogger();

/*  26 */   private final List<MapleStatEffect> effects = new ArrayList<>();
/*  27 */   private final List<Pair<String, Byte>> requiredSkill = new ArrayList<>();
/*  28 */   private final String name = "";
   private final boolean isSwitch = false;
/*  30 */   private final Map<Integer, Integer> bonusExpInfo = new HashMap<>();
   private int id;
/*  32 */   private String psdDamR = "";
/*  33 */   private String targetPlus = "";
/*  34 */   private String minionAttack = "";
/*  35 */   private String minionAbility = "";
/*  36 */   private Element element = Element.NEUTRAL;
/*  37 */   private List<MapleStatEffect> pvpEffects = null;
/*  38 */   private List<Integer> animation = null;
/*  39 */   private int hyper = 0; private int hyperStat = 0; private int reqLev = 0; private int animationTime = 0; private int masterLevel = 0; private int maxLevel = 0; private int delay = 0; private int trueMax = 0; private int eventTamingMob = 0; private int skillType = 0; private int vehicleID = 0; private int fixLevel; private int psd = 0; private int disableNextLevelInfo; private int psdSkill = 0; private int setItemReason; private int setItemPartsCount; private int maxDamageOver = 999999; private int ppRecovery = 0;

   private boolean invisible = false;
   private boolean chargeSkill = false;
   private boolean timeLimited = false;
   private boolean combatOrders = false;
   private boolean pvpDisabled = false;
   private boolean magic = false;
   private boolean casterMove = false;
   private boolean chargingSkill;
   private boolean passiveSkill;
   private boolean selfDestructMinion;
   private boolean rapidAttack;
   private boolean pushTarget = false;
   private boolean pullTarget = false;
   private boolean buffSkill = false;
   private boolean isSummon = false;
   private boolean notRemoved = false;
   private boolean disable = false;
   private boolean hasMasterLevelProperty = false;
   private boolean petPassive = false;
   private boolean finalAttack = false;
   private boolean soulSkill = false;
   private boolean notCooltimeReset = false;
   private boolean ignoreCounter = false;
/*  64 */   private List<Integer> psdSkills = null;
/*  65 */   private List<Pair<Integer, Integer>> extraSkillInfo = new ArrayList<>();






   public Skill(int id) {
/*  73 */     this.id = id;
   }

   public static Skill loadFromData(int id, MapleData data, MapleData delayData) {
/*  77 */     boolean isBuff, showSkill = false;
/*  78 */     if (showSkill) {
/*  79 */       String skillName = SkillFactory.getSkillName(id);
/*  80 */       System.out.println("正在解析技能id: " + id + " 名字: " + skillName);
/*  81 */       log.trace("正在解析技能id: " + id + " 名字: " + skillName, Boolean.valueOf(true));
     }
/*  83 */     Skill ret = new Skill(id);


/*  86 */     int skillType = MapleDataTool.getInt("skillType", data, -1);
/*  87 */     String elem = MapleDataTool.getString("elemAttr", data, null);
/*  88 */     ret.element = (elem != null) ? Element.getFromChar(elem.charAt(0)) : Element.NEUTRAL;
/*  89 */     ret.skillType = skillType;
/*  90 */     ret.invisible = (MapleDataTool.getInt("invisible", data, 0) > 0);
/*  91 */     MapleData effect = data.getChildByPath("effect");
/*  92 */     MapleData common = data.getChildByPath("common");
/*  93 */     MapleData inf = data.getChildByPath("info");
/*  94 */     MapleData hit = data.getChildByPath("hit");
/*  95 */     MapleData ball = data.getChildByPath("ball");
/*  96 */     ret.isSummon = (data.getChildByPath("summon") != null);
/*  97 */     ret.masterLevel = MapleDataTool.getInt("masterLevel", data, 0);
/*  98 */     if (ret.masterLevel > 0) {
/*  99 */       ret.hasMasterLevelProperty = true;
     }
/* 101 */     ret.notRemoved = (MapleDataTool.getInt("notRemoved", data, 0) > 0);
/* 102 */     ret.timeLimited = (MapleDataTool.getInt("timeLimited", data, 0) > 0);
/* 103 */     ret.combatOrders = (MapleDataTool.getInt("combatOrders", data, 0) > 0);
/* 104 */     ret.fixLevel = MapleDataTool.getInt("fixLevel", data, 0);
/* 105 */     ret.disable = (MapleDataTool.getInt("disable", data, 0) > 0);
/* 106 */     ret.disableNextLevelInfo = MapleDataTool.getInt("disableNextLevelInfo", data, 0);
/* 107 */     ret.eventTamingMob = MapleDataTool.getInt("eventTamingMob", data, 0);
/* 108 */     ret.vehicleID = MapleDataTool.getInt("vehicleID", data, 0);
/* 109 */     ret.hyper = MapleDataTool.getInt("hyper", data, 0);
/* 110 */     ret.hyperStat = MapleDataTool.getInt("hyperStat", data, 0);
/* 111 */     ret.reqLev = MapleDataTool.getInt("reqLev", data, 0);
/* 112 */     ret.petPassive = (MapleDataTool.getInt("petPassive", data, 0) > 0);
/* 113 */     ret.setItemReason = MapleDataTool.getInt("setItemReason", data, 0);
/* 114 */     ret.setItemPartsCount = MapleDataTool.getInt("setItemPartsCount", data, 0);
/* 115 */     ret.notCooltimeReset = (MapleDataTool.getInt("notCooltimeReset", data, 0) > 0);
/* 116 */     ret.ppRecovery = MapleDataTool.getInt("ppRecovery", data, 0);
/* 117 */     if (inf != null) {
/* 118 */       ret.pvpDisabled = (MapleDataTool.getInt("pvp", inf, 1) <= 0);
/* 119 */       ret.magic = (MapleDataTool.getInt("magicDamage", inf, 0) > 0);
/* 120 */       ret.casterMove = (MapleDataTool.getInt("casterMove", inf, 0) > 0);
/* 121 */       ret.pushTarget = (MapleDataTool.getInt("pushTarget", inf, 0) > 0);
/* 122 */       ret.pullTarget = (MapleDataTool.getInt("pullTarget", inf, 0) > 0);
/* 123 */       ret.rapidAttack = (MapleDataTool.getInt("rapidAttack", inf, 0) > 0);
/* 124 */       ret.minionAttack = MapleDataTool.getString("minionAttack", inf, "");
/* 125 */       ret.minionAbility = MapleDataTool.getString("minionAbility", inf, "");
/* 126 */       ret.selfDestructMinion = (MapleDataTool.getInt("selfDestructMinion", inf, 0) > 0);
/* 127 */       ret.chargingSkill = (MapleDataTool.getInt("chargingSkill", inf, 0) > 0 || MapleDataTool.getInt("keydownThrowing", inf, 0) > 0 || id == 2221011);
/* 128 */       ret.ignoreCounter = (MapleDataTool.getInt("ignoreCounter", data.getChildByPath("info2"), 0) > 0);
     }
/* 130 */     if (skillType == 2) {
/* 131 */       isBuff = true;
/* 132 */     } else if (skillType == 3) {
/* 133 */       ret.animation = new ArrayList<>();
/* 134 */       ret.animation.add(Integer.valueOf(0));
/* 135 */       isBuff = (effect != null);
/* 136 */       switch (id) {
         case 20040216:
         case 20040217:
         case 20040219:
         case 20040220:
         case 20041239:
/* 142 */           isBuff = true; break;
       }
     } else {
/* 145 */       MapleData action_ = data.getChildByPath("action");
/* 146 */       boolean action = false;
/* 147 */       if (action_ == null && data.getChildByPath("prepare/action") != null) {
/* 148 */         action_ = data.getChildByPath("prepare/action");
/* 149 */         action = true;
       }
/* 151 */       isBuff = (effect != null && hit == null && ball == null);
/* 152 */       if (action_ != null) {
         String d;
/* 154 */         if (action) {
/* 155 */           d = MapleDataTool.getString(action_, null);
         } else {
/* 157 */           d = MapleDataTool.getString("0", action_, null);
         }
/* 159 */         if (d != null) {
/* 160 */           isBuff |= d.equals("alert2");
/* 161 */           MapleData dd = delayData.getChildByPath(d);
/* 162 */           if (dd != null) {
/* 163 */             for (MapleData del : dd) {
/* 164 */               ret.delay += Math.abs(MapleDataTool.getInt("delay", del, 0));
             }
/* 166 */             if (ret.delay > 30) {
/* 167 */               ret.delay = (int)Math.round(ret.delay * 11.0D / 16.0D);
/* 168 */               ret.delay -= ret.delay % 30;
             }
           }
/* 171 */           if (SkillFactory.getDelay(d) != null) {
/* 172 */             ret.animation = new ArrayList<>();
/* 173 */             ret.animation.add(SkillFactory.getDelay(d));
/* 174 */             if (!action) {
/* 175 */               for (MapleData ddc : action_) {
/* 176 */                 if (!MapleDataType.CANVAS.equals(ddc.getType()) && !MapleDataTool.getString(ddc, d).equals(d) && !ddc.getName().contentEquals("delay")) {
/* 177 */                   String c = MapleDataTool.getString(ddc);
/* 178 */                   if (SkillFactory.getDelay(c) != null) {
/* 179 */                     ret.animation.add(SkillFactory.getDelay(c));
                   }
                 }
               }
             }
           }
         }
       }
/* 187 */       isBuff = SkillConstants.isBuffSkill(id, isBuff);
     }
/* 189 */     ret.chargeSkill = (data.getChildByPath("keydown") != null);
/* 190 */     if (inf != null) {
/* 191 */       inf.getChildren().forEach(mapleData -> {
             if (mapleData.getName().equals("finalAttack") && ((Integer)mapleData.getData()).intValue() == 1 && !SkillFactory.getFinalAttackSkills().contains(Integer.valueOf(id))) {
               ret.finalAttack = true;
               SkillFactory.getFinalAttackSkills().add(Integer.valueOf(id));
             }
           });
     }
/* 198 */     if (!ret.chargeSkill)
     {

/* 201 */       switch (id) {
         case 2221012:
         case 27121201:
         case 112111016:
/* 205 */           ret.chargeSkill = true;
           break;
       }
     }
/* 209 */     if (common != null) {
/* 210 */       ret.soulSkill = (common.getChildByPath("soulmpCon") != null);
/* 211 */       ret.maxLevel = MapleDataTool.getInt("maxLevel", common, 1);
/* 212 */       ret.psdDamR = MapleDataTool.getString("damR", common, "");
/* 213 */       ret.targetPlus = MapleDataTool.getString("targetPlus", common, "");
/* 214 */       ret.trueMax = ret.maxLevel + (ret.combatOrders ? 2 : 0);
/* 215 */       for (int i = 1; i <= ret.trueMax; i++) {
/* 216 */         ret.effects.add(MapleStatEffectFactory.loadSkillEffectFromData(common, id, isBuff, i, "x", ret.notRemoved));
       }
/* 218 */       ret.maxDamageOver = MapleDataTool.getInt("MDamageOver", common, 999999);
     } else {
/* 220 */       for (MapleData leve : data.getChildByPath("level")) {
/* 221 */         ret.effects.add(MapleStatEffectFactory.loadSkillEffectFromData(leve, id, isBuff, Byte.parseByte(leve.getName()), null, ret.notRemoved));
       }
/* 223 */       ret.maxLevel = ret.effects.size();
/* 224 */       ret.trueMax = ret.effects.size();
     }
/* 226 */     boolean loadPvpSkill = false;
/* 227 */     if (loadPvpSkill) {
/* 228 */       MapleData level2 = data.getChildByPath("PVPcommon");
/* 229 */       if (level2 != null) {
/* 230 */         ret.pvpEffects = new ArrayList<>();
/* 231 */         for (int i = 1; i <= ret.trueMax; i++) {
/* 232 */           ret.pvpEffects.add(MapleStatEffectFactory.loadSkillEffectFromData(level2, id, isBuff, i, "x", ret.notRemoved));
         }
       }
     }
/* 236 */     MapleData psdskill = data.getChildByPath("psdSkill");
/* 237 */     if (psdskill != null) {
/* 238 */       ret.psdSkills = new ArrayList<>();
/* 239 */       psdskill.forEach(mapleData -> ret.psdSkills.add(Integer.valueOf(mapleData.getName())));
     }
/* 241 */     MapleData reqDataRoot = data.getChildByPath("req");
/* 242 */     if (reqDataRoot != null) {
/* 243 */       for (MapleData reqData : reqDataRoot.getChildren()) {
/* 244 */         ret.requiredSkill.add(new Pair(reqData.getName(), Byte.valueOf((byte)MapleDataTool.getInt(reqData, 1))));
       }
     }
/* 247 */     ret.animationTime = 0;
/* 248 */     if (effect != null) {
/* 249 */       for (MapleData effectEntry : effect) {
/* 250 */         ret.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
       }
     }

/* 254 */     MapleData extraSkillInfo = data.getChildByPath("extraSkillInfo");
/* 255 */     if (extraSkillInfo != null) {
/* 256 */       for (MapleData effectEntry : extraSkillInfo) {
/* 257 */         ret.extraSkillInfo.add(new Pair(Integer.valueOf(id), Integer.valueOf(MapleDataTool.getIntConvert("skill", effectEntry, 0))));
       }
     }


/* 262 */     ret.buffSkill = isBuff;
/* 263 */     switch (id) {
       case 27000207:
       case 27001100:
       case 27001201:
/* 267 */         ret.masterLevel = ret.maxLevel;
         break;
     }

/* 271 */     MapleData growthInfo = data.getChildByPath("growthInfo/level");
/* 272 */     if (growthInfo != null) {
/* 273 */       for (MapleData expData : growthInfo.getChildren()) {
/* 274 */         ret.bonusExpInfo.put(Integer.valueOf(Integer.parseInt(expData.getName())), Integer.valueOf(MapleDataTool.getInt("maxExp", expData, 100000000)));
       }
     }
/* 277 */     return ret;
   }

   public int getId() {
/* 281 */     return this.id;
   }

   public String getName() {
/* 285 */     return "";
   }

   public MapleStatEffect getEffect(int level) {
/* 289 */     return getEffect(false, level);
   }

   public MapleStatEffect getPVPEffect(int level) {
/* 293 */     return getEffect(true, level - 1);
   }

   private MapleStatEffect getEffect(boolean ispvp, int level) {
/* 297 */     List<MapleStatEffect> effects = ispvp ? this.pvpEffects : this.effects;
/* 298 */     if (effects.size() < level) {
/* 299 */       if (effects.size() > 0) {
/* 300 */         return effects.get(effects.size() - 1);
       }
/* 302 */       return null;
/* 303 */     }  if (level <= 0) {
/* 304 */       return effects.get(0);
     }
/* 306 */     return effects.get(level - 1);
   }

   public int getSkillType() {
/* 310 */     return this.skillType;
   }

   public List<Integer> getAllAnimation() {
/* 314 */     return this.animation;
   }

   public int getAnimation() {
/* 318 */     if (this.animation == null) {
/* 319 */       return -1;
     }
/* 321 */     return ((Integer)this.animation.get(Randomizer.nextInt(this.animation.size()))).intValue();
   }

   public void setAnimation(List<Integer> animation) {
/* 325 */     this.animation = animation;
   }

   public int getPsdSkill() {
/* 329 */     return this.psdSkill;
   }

   public int getPsd() {
/* 333 */     return this.psd;
   }

   public String getPsdDamR() {
/* 337 */     return this.psdDamR;
   }

   public String getTargetPlus() {
/* 341 */     return this.targetPlus;
   }

   public boolean isPVPDisabled() {
/* 345 */     return this.pvpDisabled;
   }

   public boolean isChargeSkill() {
/* 349 */     return this.chargeSkill;
   }

   public boolean isInvisible() {
/* 353 */     return this.invisible;
   }

   public boolean isNotRemoved() {
/* 357 */     return this.notRemoved;
   }

   public boolean isRapidAttack() {
/* 361 */     return this.rapidAttack;
   }

   public boolean isPassiveSkill() {
/* 365 */     return this.passiveSkill;
   }

   public boolean isChargingSkill() {
/* 369 */     return this.chargingSkill;
   }

   public boolean hasRequiredSkill() {
/* 373 */     return (this.requiredSkill.size() > 0);
   }

   public List<Pair<String, Byte>> getRequiredSkills() {
/* 377 */     return this.requiredSkill;
   }

   public int getMaxLevel() {
/* 381 */     return this.maxLevel;
   }

   public int getTrueMax() {
/* 385 */     return this.trueMax;
   }

   public boolean combatOrders() {
/* 389 */     return this.combatOrders;
   }

   public boolean canBeLearnedBy(int job) {
/* 393 */     int skillForJob = this.id / 10000;
/* 394 */     if (skillForJob == 2001)
/* 395 */       return JobConstants.is龙神(job); 
/* 396 */     if (skillForJob == 0)
/* 397 */       return JobConstants.is冒险家(job); 
/* 398 */     if (skillForJob == 301)
/* 399 */       return JobConstants.is古迹猎人(job); 
/* 400 */     if (skillForJob == 500)
/* 401 */       return (JobConstants.is拳手(job) || JobConstants.is火枪手(job)); 
/* 402 */     if (skillForJob == 501)
/* 403 */       return JobConstants.is火炮手(job); 
/* 404 */     if (skillForJob == 508)
/* 405 */       return JobConstants.is龙的传人(job); 
/* 406 */     if (skillForJob == 509)
/* 407 */       return (JobConstants.is拳手新(job) || JobConstants.is火枪手新(job)); 
/* 408 */     if (skillForJob == 1000)
/* 409 */       return JobConstants.is骑士团(job); 
/* 410 */     if (skillForJob == 2000)
/* 411 */       return JobConstants.is战神(job); 
/* 412 */     if (skillForJob == 2002)
/* 413 */       return JobConstants.is双弩精灵(job); 
/* 414 */     if (skillForJob == 2003)
/* 415 */       return JobConstants.is幻影(job); 
/* 416 */     if (skillForJob == 2004)
/* 417 */       return JobConstants.is夜光(job); 
/* 418 */     if (skillForJob == 2500)
/* 419 */       return JobConstants.is隐月(job); 
/* 420 */     if (skillForJob == 3000)
/* 421 */       return JobConstants.is反抗者(job); 
/* 422 */     if (skillForJob == 3001)
/* 423 */       return JobConstants.is恶魔猎手(job); 
/* 424 */     if (skillForJob == 3002)
/* 425 */       return JobConstants.is尖兵(job); 
/* 426 */     if (skillForJob == 5000)
/* 427 */       return JobConstants.is米哈尔(job); 
/* 428 */     if (skillForJob == 6000)
/* 429 */       return JobConstants.is狂龙战士(job); 
/* 430 */     if (skillForJob == 6001)
/* 431 */       return JobConstants.is爆莉萌天使(job); 
/* 432 */     if (skillForJob == 10000)
/* 433 */       return JobConstants.is神之子(job); 
/* 434 */     if (skillForJob == 11000)
/* 435 */       return JobConstants.is林之灵(job); 
/* 436 */     if (skillForJob == 15001)
/* 437 */       return JobConstants.is影魂异人(job); 
/* 438 */     if (skillForJob == 16000)
/* 439 */       return JobConstants.is虎影(job); 
/* 440 */     if (skillForJob == 15002)
/* 441 */       return JobConstants.is御剑骑士(job); 
/* 442 */     if (job / 100 != skillForJob / 100)
/* 443 */       return false; 
/* 444 */     if (job / 1000 != skillForJob / 1000)
/* 445 */       return false; 
/* 446 */     if (JobConstants.is林之灵(skillForJob) && !JobConstants.is林之灵(job))
/* 447 */       return false; 
/* 448 */     if (JobConstants.is神之子(skillForJob) && !JobConstants.is神之子(job))
/* 449 */       return false; 
/* 450 */     if (JobConstants.is爆莉萌天使(skillForJob) && !JobConstants.is爆莉萌天使(job))
/* 451 */       return false; 
/* 452 */     if (JobConstants.is狂龙战士(skillForJob) && !JobConstants.is狂龙战士(job))
/* 453 */       return false; 
/* 454 */     if (JobConstants.is米哈尔(skillForJob) && !JobConstants.is米哈尔(job))
/* 455 */       return false; 
/* 456 */     if (JobConstants.is尖兵(skillForJob) && !JobConstants.is尖兵(job))
/* 457 */       return false; 
/* 458 */     if (JobConstants.is夜光(skillForJob) && !JobConstants.is夜光(job))
/* 459 */       return false; 
/* 460 */     if (JobConstants.is隐月(skillForJob) && !JobConstants.is隐月(job))
/* 461 */       return false; 
/* 462 */     if (JobConstants.is幻影(skillForJob) && !JobConstants.is幻影(job))
/* 463 */       return false; 
/* 464 */     if (JobConstants.is龙的传人(skillForJob) && !JobConstants.is龙的传人(job))
/* 465 */       return false; 
/* 466 */     if (JobConstants.is火炮手(skillForJob) && !JobConstants.is火炮手(job))
/* 467 */       return false; 
/* 468 */     if (JobConstants.is拳手(skillForJob) && !JobConstants.is拳手(job))
/* 469 */       return false; 
/* 470 */     if (JobConstants.is火枪手(skillForJob) && !JobConstants.is火枪手(job))
/* 471 */       return false; 
/* 472 */     if (JobConstants.is拳手新(skillForJob) && !JobConstants.is拳手新(job))
/* 473 */       return false; 
/* 474 */     if (JobConstants.is火枪手新(skillForJob) && !JobConstants.is火枪手新(job))
/* 475 */       return false; 
/* 476 */     if (JobConstants.is恶魔复仇者(skillForJob) && !JobConstants.is恶魔复仇者(job))
/* 477 */       return false; 
/* 478 */     if (JobConstants.is恶魔猎手(skillForJob) && !JobConstants.is恶魔猎手(job))
/* 479 */       return false; 
/* 480 */     if (JobConstants.is冒险家(skillForJob) && !JobConstants.is冒险家(job))
/* 481 */       return false; 
/* 482 */     if (JobConstants.is骑士团(skillForJob) && !JobConstants.is骑士团(job))
/* 483 */       return false; 
/* 484 */     if (JobConstants.is战神(skillForJob) && !JobConstants.is战神(job))
/* 485 */       return false; 
/* 486 */     if (JobConstants.is龙神(skillForJob) && !JobConstants.is龙神(job))
/* 487 */       return false; 
/* 488 */     if (JobConstants.is双弩精灵(skillForJob) && !JobConstants.is双弩精灵(job))
/* 489 */       return false; 
/* 490 */     if (JobConstants.is反抗者(skillForJob) && !JobConstants.is反抗者(job))
/* 491 */       return false; 
/* 492 */     if (JobConstants.is超能力者(skillForJob) && !JobConstants.is超能力者(job))
/* 493 */       return false; 
/* 494 */     if (JobConstants.is古迹猎人(skillForJob) && !JobConstants.is古迹猎人(job))
/* 495 */       return false; 
/* 496 */     if (JobConstants.is影魂异人(skillForJob) && !JobConstants.is影魂异人(job))
/* 497 */       return false; 
/* 498 */     if (JobConstants.is魔链隐士(skillForJob) && !JobConstants.is魔链隐士(job))
/* 499 */       return false; 
/* 500 */     if (JobConstants.is虎影(skillForJob) && !JobConstants.is虎影(job))
/* 501 */       return false; 
/* 502 */     if (JobConstants.is御剑骑士(skillForJob) && !JobConstants.is御剑骑士(job))
/* 503 */       return false; 
/* 504 */     if (job / 10 % 10 == 0 && skillForJob / 10 % 10 > job / 10 % 10)
/* 505 */       return false; 
/* 506 */     if (skillForJob / 10 % 10 != 0 && skillForJob / 10 % 10 != job / 10 % 10)
/* 507 */       return false; 
/* 508 */     if (skillForJob % 10 > job % 10) {
/* 509 */       return false;
     }
/* 511 */     return true;
   }

   public boolean isTimeLimited() {
/* 515 */     return this.timeLimited;
   }
































































   public Element getElement() {
/* 582 */     return this.element;
   }

   public int getAnimationTime() {
/* 586 */     return this.animationTime;
   }

   public boolean getDisable() {
/* 590 */     return this.disable;
   }

   public int getFixLevel() {
/* 594 */     return this.fixLevel;
   }

   public int getMasterLevel() {
/* 598 */     return this.masterLevel;
   }

   public int getDisableNextLevelInfo() {
/* 602 */     return this.disableNextLevelInfo;
   }

   public int getDelay() {
/* 606 */     return this.delay;
   }

   public int getTamingMob() {
/* 610 */     return this.eventTamingMob;
   }

   public int getVehicleID() {
/* 614 */     return this.vehicleID;
   }

   public int getHyper() {
/* 618 */     return this.hyper;
   }

   public int getReqLevel() {
/* 622 */     return this.reqLev;
   }

   public int getMaxDamageOver() {
/* 626 */     return this.maxDamageOver;
   }

   public int getBonusExpInfo(int level) {
/* 630 */     if (this.bonusExpInfo.isEmpty()) {
/* 631 */       return -1;
     }
/* 633 */     if (this.bonusExpInfo.containsKey(Integer.valueOf(level))) {
/* 634 */       return ((Integer)this.bonusExpInfo.get(Integer.valueOf(level))).intValue();
     }
/* 636 */     return -1;
   }

   public Map<Integer, Integer> getBonusExpInfo() {
/* 640 */     return this.bonusExpInfo;
   }

   public boolean isMagic() {
/* 644 */     return this.magic;
   }

   public boolean isMovement() {
/* 648 */     return this.casterMove;
   }

   public boolean isPush() {
/* 652 */     return this.pushTarget;
   }

   public boolean isPull() {
/* 656 */     return this.pullTarget;
   }

   public boolean isBuffSkill() {
/* 660 */     return this.buffSkill;
   }

   public boolean isSummonSkill() {
/* 664 */     return this.isSummon;
   }

   public boolean isNonAttackSummon() {
/* 668 */     return (this.isSummon && this.minionAttack.isEmpty() && (this.minionAbility.isEmpty() || this.minionAbility.equals("taunt")));
   }

   public boolean isNonExpireSummon() {
/* 672 */     return this.selfDestructMinion;
   }

   public boolean isHyperSkill() {
/* 676 */     return (this.hyper > 0 && this.reqLev > 0);
   }

   public boolean isHyperStat() {
/* 680 */     return (this.hyperStat > 0);
   }




   public boolean isGuildSkill() {
/* 687 */     int jobId = this.id / 10000;
/* 688 */     return (jobId == 9100);
   }




   public boolean isBeginnerSkill() {
/* 695 */     int jobId = this.id / 10000;
/* 696 */     return JobConstants.is新手职业(jobId);
   }




   public boolean isAdminSkill() {
/* 703 */     int jobId = this.id / 10000;
/* 704 */     return (jobId == 800 || jobId == 900);
   }




   public boolean isInnerSkill() {
/* 711 */     int jobId = this.id / 10000;
/* 712 */     return (jobId == 7000);
   }




   public boolean isSpecialSkill() {
/* 719 */     int jobId = this.id / 10000;
/* 720 */     return (jobId == 7000 || jobId == 7100 || jobId == 8000 || jobId == 9000 || jobId == 9100 || jobId == 9200 || jobId == 9201 || jobId == 9202 || jobId == 9203 || jobId == 9204);
   }

   public int getSkillByJobBook() {
/* 724 */     return getSkillByJobBook(this.id);
   }

   public int getSkillByJobBook(int skillid) {
/* 728 */     switch (skillid / 10000) {
       case 112:
       case 122:
       case 132:
       case 212:
       case 222:
       case 232:
       case 312:
       case 322:
       case 412:
       case 422:
       case 512:
       case 522:
/* 741 */         return 4;
       case 111:
       case 121:
       case 131:
       case 211:
       case 221:
       case 231:
       case 311:
       case 321:
       case 411:
       case 421:
       case 511:
       case 521:
/* 754 */         return 3;
       case 110:
       case 120:
       case 130:
       case 210:
       case 220:
       case 230:
       case 310:
       case 320:
       case 410:
       case 420:
       case 510:
       case 520:
/* 767 */         return 2;
       case 100:
       case 200:
       case 300:
       case 400:
       case 500:
/* 773 */         return 1;
     }
/* 775 */     return -1;
   }




   public boolean isPetPassive() {
/* 782 */     return this.petPassive;
   }




   public int getSetItemReason() {
/* 789 */     return this.setItemReason;
   }




   public int geSetItemPartsCount() {
/* 796 */     return this.setItemPartsCount;
   }






   public boolean isSwitch() {
/* 805 */     return false;
   }




   public boolean isTeachSkills() {
/* 812 */     return SkillConstants.isTeachSkills(this.id);
   }




   public boolean isLinkSkills() {
/* 819 */     return SkillConstants.isLinkSkills(this.id);
   }

   public boolean is老技能() {
/* 823 */     switch (this.id) {









       case 11000005:
       case 11000006:
       case 11001001:
       case 11001002:
       case 11001003:
       case 11001004:
       case 11100000:
       case 11100007:
       case 11101001:
       case 11101002:
       case 11101003:
       case 11101004:
       case 11101005:
       case 11101006:
       case 11101008:
       case 11110000:
       case 11110005:
       case 11111001:
       case 11111002:
       case 11111003:
       case 11111004:
       case 11111006:
       case 11111007:
       case 11111008:
       case 13000000:
       case 13000001:
       case 13000005:
       case 13001003:
       case 13001004:
       case 13100000:
       case 13100008:
       case 13101001:
       case 13101002:
       case 13101003:
       case 13101004:
       case 13101005:
       case 13101006:
       case 13101007:
       case 13110003:
       case 13110008:
       case 13110009:
       case 13111000:
       case 13111001:
       case 13111002:
       case 13111004:
       case 13111005:
       case 13111006:
       case 13111007:
       case 15000000:
       case 15000005:
       case 15000006:
       case 15000008:
       case 15001002:
       case 15001003:
       case 15001004:
       case 15001007:
       case 15100001:
       case 15100004:
       case 15100009:
       case 15101002:
       case 15101003:
       case 15101005:
       case 15101008:
       case 15101010:
       case 15110009:
       case 15110010:
       case 15111004:
       case 15111005:
       case 15111006:
       case 15111007:
       case 15111008:
       case 15111011:
       case 15111012:
/* 906 */         return true;
     }
/* 908 */     return false;
   }

   public boolean isAngelSkill() {
/* 912 */     return SkillConstants.is天使祝福戒指(this.id);
   }

   public boolean isLinkedAttackSkill() {
/* 916 */     return SkillConstants.isLinkedAttackSkill(this.id);
   }

   public boolean isDefaultSkill() {
/* 920 */     return (getFixLevel() > 0);
   }

   public int getPPRecovery() {
/* 924 */     return this.ppRecovery;
   }

   public boolean isSoulSkill() {
/* 928 */     return this.soulSkill;
   }

   public void setSoulSkill(boolean soulSkill) {
/* 932 */     this.soulSkill = soulSkill;
   }

   public boolean isNotCooltimeReset() {
/* 936 */     return this.notCooltimeReset;
   }

   public List<Integer> getPsdSkills() {
/* 940 */     return this.psdSkills;
   }

   public List<Pair<Integer, Integer>> getExtraSkillInfo() {
/* 944 */     return this.extraSkillInfo;
   }

   public boolean isIgnoreCounter() {
/* 948 */     return this.ignoreCounter;
   }


   public boolean isKeydownSkill() {
/* 953 */     return (isRapidAttack() || isChargeSkill() || isChargingSkill());
   }

   public Skill() {}

private enum SkillType {

    BUFF_ICO(10),
    PASSIVE(30, 31, 50, 51),//不同類型的被動技能
    PASSIVE_TRUE(50),//唯一类型的被动技能
    MONSTER_DEBUFF(32),//怪物異常效果技能
    SPAWN_OBJECT(33),//基本上全是召喚類技能
    MONSTER_DEBUFF_OR_CANCEL(34),//用於取消怪物特定效果的技能
    SINGLE_EFFECT(35),//非攻擊技能 楓葉淨化
    PROTECTIVE_MIST(36),//在地圖中召喚中特定的技能效果 如（煙幕彈）
    RESURRECT(38),//復活玩家技能
    MOVEMENT(40),//移動相關技能
    MOVEMENT_RANDOM(42),//龍之氣息 隨便移動到地圖上某個地方
    KEY_COMBO_ATTACK(52),//連擊技能
    COVER_SKILL(98),//雙重攻擊 終極攻擊 超級體 重裝武器精通 猴子衝擊
    ;//效果分類是特別奇怪的··但基本上都是 >= 10 (不包含上述聲明)
    final int[] vals;

    SkillType(int... vals) {
        this.vals = vals;
    }
}

 }


/* Location:              C:\PGX\Server.jar!\client\skills\Skill.class
 * Java compiler version: 8 (52.0)
 * JD-Core Version:       1.1.3
 */